// 数字后面附加字母 "e" 并指定零的个数来缩短数字。

console.log(1e9) // 1000000000，表示 数字 1 后面跟 9 个 0
console.log(7.3e9) // 7300000000

// 计算规则：
// 1e3 => 1 * 1000
// 1.23e6 => 1.23 * 1000000

console.log(1e-6) // 0.000001
console.log(1.23e-6) // 0.00000123
console.log(1234e-2) // 12.34

// 计算规则：
// 1e6 => 1 / 1000000
// 1.23e-6 => 1.23 / 1000000
// 1234e-2 => 1234 / 100

// ***************************************************************************

// 涵盖了处理数字小数部分的所有可能方法:

// 向下取整：
console.log(Math.floor(3.1)) // 3
console.log(Math.floor(3.5)) // 3
console.log(Math.floor(3.8)) // 3

// 向上取整：
console.log(Math.ceil(3.1)) // 4
console.log(Math.ceil(3.5)) // 4
console.log(Math.ceil(3.8)) // 4

// 向最近的整数舍入：
console.log(Math.round(3.1)) // 3
console.log(Math.round(3.4)) // 3
console.log(Math.round(3.5)) // 4
console.log(Math.round(3.8)) // 4

// 移除小数点后的内容
console.log(Math.trunc(1.2)) // 1
console.log(Math.trunc(1.23)) // 1
console.log(Math.trunc(-1.23)) // -1

// ***************************************************************************

// 【精度损失】

// 一个数字以其二进制的形式存储在内存中。0.1，0.2 这样的小数，实际上在二进制形式中是无限循环小数。
console.log(0.1 + 0.2 == 0.3) // false
console.log(0.1 + 0.2) // 0.30000000000000004

// 解决精度损失最可靠的方法是使用 toFixed() 方法对结果进行舍入并保留两位小数：
console.log(Number((0.1 + 0.2).toFixed(2)) == 0.3) // true

// ***************************************************************************

// isNaN(value) 将参数转换为数字，然后测试它是否为 NaN。
console.log(isNaN(NaN)) // true
console.log(isNaN(10)) // false
console.log(isNaN('str')) // true

// Number.isNaN(value) 只做 NaN 的检查，不做类型转换。
console.log(Number.isNaN(NaN)) // true
console.log(Number.isNaN(10)) // false
console.log(Number.isNaN('str')) // false

// isFinite(value) 将参数转换为数字，如果转换后不是 NaN Infinity -Infinity，则返回 true。
console.log(isFinite(10)) // true
console.log(isFinite(10e1000)) // false
console.log(isFinite('100')) // true
console.log(isFinite('str')) // false

// Number.isFinite(value) 只做数字的检查，不做类型转换。
console.log(Number.isFinite(10)) // true
console.log(Number.isFinite(10e1000)) // false
console.log(Number.isFinite('100')) // false
console.log(Number.isFinite('str')) // false

// ***************************************************************************

// 特殊的内建方法 Object.is(value, value)，它类似于 === 一样对值进行比较。
// 这种比较方式经常被用在 JavaScript 规范中。当内部算法需要比较两个值"是否完全相同时"，它使用 Object.is。

console.log(Object.is(NaN, NaN)) // true
console.log(Object.is(0, -0)) // false

// ***************************************************************************

// parseInt 和 parseFloat 提取字符串中的数字。

console.log(parseInt('100px')) // 100
console.log(parseInt('1.25em')) // 1 只返回整数部分
console.log(parseInt('str123')) // NaN

console.log(parseFloat('12px')) // 12
console.log(parseFloat('1.25em')) // 1.25
console.log(parseFloat('str1.25')) // NaN

// ***************************************************************************

// Math 内建对象其他数学函数：

// 1. Math.random() 返回 0 ~ 1 的随机数（不包括1）
console.log(Math.random())

// 2. Math.max(a, b, c...) 和 Math.min(a, b, c...) 返回任意参数中的最大值和最小值。
let nums = [0, 1, 3, 5, 9, -8]
console.log(Math.max(...nums)) // 9
console.log(Math.min(...nums)) // -8

// 3. Math.pow(x, y) 返回 x 的 y 次幂。
console.log(2 ** 3) // 8
console.log(Math.pow(2, 3)) // 8
